/**
 * 调试专用模块，向外提供log(obj)方法。
 * 当浏览支持控制台时，log方法调用console.log。
 * 当浏览器不支持控制台时（如ie6/7/8），将会弹出一个调试信息窗口。
 * 另外，按住ctrl键的同时双击body会弹出调试信息窗口。
 * 注：此文件应该优先于LongUtils.js、CommonUtils.js和AppUtils.js加载，
 *     因此，这里不能调用这些工具的方法。
 * @author linzongxue
 */
define(function(){
	//支持控制台的浏览器
	if (typeof console !== 'undefined' && console.log){
		window.log = function(obj){
			console.log(obj);
		};
		return;
	}
	//不支持控制台的浏览器
	var bw = Ext.getBody().getViewSize().width, bh = Ext.getBody().getViewSize().height;
	var width = bw < 400 ? bw - 10 : 400;
	var height = bh < 300 ? bh - 10 : 300;
	var debugWin = new Ext.Window({
		title: '调试信息',
		x: bw - width - 5,
		y: bh - height - 5,
		width: width,
		height: height,
		collapsible: true,
		maximizable: false,
	    iconCls: 'icon-window',
	    closeAction: 'hide',
		tbar:[
			{text:'清空', handler: function(){debugWin.clearInfo();}}
		],
		html:'<div id="debug_info" style="width:98%;height:98%;height-line:20px;padding:3px;background:#000;color:#0f0;font-size:12px;overflow:auto;"></div>',
		listeners:{
			afterrender: function(){
				this.debugInfo = Ext.get('debug_info').dom;
			},
			show: function(){ //打开窗口时看到最后的信息
				this.debugInfo.scrollTop = this.debugInfo.scrollHeight;
			},
			move: function(win, x, y){ //记住窗口的相对高度，以保持位置
				this.scrollTop = y - getBodyScrollTop();
			}
		},
		debugInfo: null, //在afterrender事件中初始化
		writeInfo: function(msg){
			var time = '<span style="color:#ff0">[' + new Date().format('H:m:i') + '] </span>';
			this.debugInfo.innerHTML += time + msg + "<br/>";
			this.debugInfo.scrollTop = this.debugInfo.scrollHeight;
			if (!this.isVisible()) this.show();
		},
		clearInfo: function(){
			this.debugInfo.innerHTML = '';
		},
		keepPosition: function(){
			if (this.scrollTop + this.getHeight() > Ext.getBody().getViewSize().height){
				//防止无穷地向下滚动
				return;
			}
			this.setPosition(this.getPosition()[0], getBodyScrollTop() + this.scrollTop);
		}
	});
	//先显示，然后隐藏，目的是尽早触发afterrender事件
	debugWin.show();
	debugWin.hide();
	debugWin.setAnimateTarget(Ext.getBody());
	
	/**
	 * 向外提供debug方法。
	 * @param obj 要显示的对象
	 * @param showAll 是否逐层遍历所有子属性
	 */
	window.log = function(obj, showAll){
		if (showAll){
			debugWin.writeInfo(Ext.encode(obj));
			return;
		}
		var result = '';
		if (obj == null || typeof obj !== 'object'){
			result = obj;
		}
		else{
			var r = [];
			for (var p in obj){
				var v = (typeof obj[p] == 'string') ? '\'' + obj[p] + '\'' : '' + obj[p] + '';
				if (v.length > 200) v = v.substring(0, 198) + '...';
				v = v.replace(/</g, '&lt;');
				r.push("'" + p +"': " + v);
			}
			result = r.length > 0 ? '{' + r.join('<br>') + '}' : obj.toString();
		}

		debugWin.writeInfo(result);
	};

	/**
	 * debug模式下，按住ctrl键的同时双击body会弹出调试信息窗口
	 */
	Ext.getDoc().on('dblclick', function(e){
		if (Ext.EventObject.ctrlKey){
			debugWin.show();
		}
	});
	
	/*
	 * body滚动时保持窗口位置
	 */
	window.onscroll = function(){
		if (debugWin.isVisible()){
			debugWin.keepPosition();
		}
	};
	
	function getBodyScrollTop(){
		return document.documentElement.scrollTop || document.body.scrollTop;
	}
});